;
(deftemplate osoba
	(slot nazwa)
	(slot koszt)
	(slot szybkosc)
	(slot bezpieczenstwo)
	(slot wygoda)
	(slot pojazd_mechaniczny (allowed-values tak nie) (default nie))
	(slot rodzaj_pojazdu (allowed-values brak mpk samochod rower) (default brak))
	(slot polozenie (default 0))
)
;(assert(osoba(nazwa pieszy)(koszt 0)(szybkosc 10)(bezpieczenstwo 50)(wygoda 20)))
;(assert(osoba(nazwa kierowca)(koszt 30)(szybkosc 50)(bezpieczenstwo 80)(wygoda 80)(pojazd_mechaniczny tak)(rodzaj_pojazdu samochod)))
;(assert(osoba(nazwa kierowca_mpk)(pojazd_mechaniczny tak)(rodzaj_pojazdu mpk)))

;
(deftemplate sygnalizacja
	(slot numer)
	(slot swiatlo (allowed-values zielone czerwone)(default zielone))
	(slot czas_zmiany (default 5))
)

;
(deftemplate polaczenie
	(slot skad)
	(slot dokad)
	(slot czynne (allowed-values tak nie) (default tak))
	(slot rodzaj (allowed-values kazdy niemechaniczny mechaniczny samochod mpk) (default kazdy))
)

;
(deftemplate akcja
	(slot typ_akcji)
)

(deftemplate awaria
	(slot u_kogo)
	(slot stopien_problemu (default 1))
	(slot szybkosc_przed (default 0))
)

(deftemplate naprawa
	(slot u_kogo)
	(slot koszt)
)

(deftemplate zablokuj
	(slot skad)
	(slot dokad)
	(slot powod (default korek))
)

(deftemplate odblokuj
	(slot skad)
	(slot dokad)
)

;
(deftemplate pogoda
	(slot typ (allowed-values upal zwykla deszcz snieg mgla))
)

(deftemplate pora_dnia
	(slot czas (allowed-values rano poludnie wieczor noc))
)

;
(deffacts mozliwa_sygnalizazja
	;(sygnalizacja (numer 1) (czas_zmiany 6)(swiatlo czerwone))
	(sygnalizacja (numer 2) (czas_zmiany 10))
	(sygnalizacja (numer 3))
	(sygnalizacja (numer 4))
	(sygnalizacja (numer 5) (czas_zmiany 3))
	(sygnalizacja (numer 6) (czas_zmiany 8))
)

;
(deffacts mozliwe_polaczenia
	(polaczenie (skad 0) (dokad 1))
	(polaczenie (skad 1) (dokad 2) (rodzaj mechaniczny))
	(polaczenie (skad 1) (dokad 4) (rodzaj niemechaniczny))
	(polaczenie (skad 2) (dokad 3) (rodzaj mpk))
	(polaczenie (skad 2) (dokad 4) (rodzaj samochod))
	(polaczenie (skad 3) (dokad 5) (rodzaj mpk))
	(polaczenie (skad 5) (dokad 6) (rodzaj mpk))
	
	(polaczenie (skad 4) (dokad 7))
	(polaczenie (skad 6) (dokad 7) (rodzaj mpk))	
)

(deffacts poczatkowe_akcje
	(akcja (typ_akcji start))
	;(pora_dnia (czas poludnie))
	;(pogoda (typ zwykla))
)


;
(defrule ruch_poczatkowy
	?o <- (osoba (nazwa ?na) (pojazd_mechaniczny ?pm) (rodzaj_pojazdu ?rp) (polozenie 0))
	?p <- (polaczenie (skad 0) (dokad ?do))
	(akcja(typ_akcji start))
	=>
	(modify ?o(polozenie ?do))
	;(printout t ?na " zmienil polozenie z " 0 " na " ?do crlf)
	(assert(akcja(typ_akcji w_trakcie)))
)

;
(defrule ruch
	?o <- (osoba (nazwa ?na) (szybkosc ?sz) (pojazd_mechaniczny ?pm) (rodzaj_pojazdu ?rp) (polozenie ?po))
	?p <- (polaczenie (skad ?po) (dokad ?do) (czynne ?cz) (rodzaj ?ro))
	?s <- (sygnalizacja (numer ?po) (swiatlo ?sw))
	(akcja(typ_akcji w_trakcie))
	=>
	(if (> ?sz 0)
		then
		(if (or (= (str-compare ?ro "kazdy") 0) (and (= (str-compare ?pm "nie") 0) (= (str-compare ?ro "niemechaniczny") 0)) (and (= (str-compare ?pm "tak") 0) (or (= (str-compare ?ro "mechaniczny") 0) (= (str-compare ?ro ?rp) 0))))
			then
			(if (= (str-compare ?sw "zielone") 0)
				then
					(if (= (str-compare ?cz "tak") 0)
						then
						(modify ?o(polozenie ?do))
						;(printout t "Zielone swiatlo, " ?na " zmienil polozenie z " ?po " na " ?do crlf)
						else
						
						(printout t "Brak mozliwosci przejazdu, " ?na " stoi w miejscu " ?po crlf)
					)
				else
					;(modify ?s(swiatlo zielone))
					(printout t "Czerwone swiatlo, " ?na " stoi w miejscu " ?po crlf)
			)
		)
		else
		(printout t "" ?na " ma predkosc 0, wiec stoi w miejscu " ?po "." crlf)
	)
)

(defrule koniec
	?o <- (osoba (nazwa ?na) (polozenie 7))
	(akcja(typ_akcji w_trakcie))
	=>
	(printout t ?na " dotarl do celu." crlf)
	(retract ?o)
)

;(defrule zmiana_swiatla
;	(sygnalizacja (numer ?nr) (swiatlo ?sw))
;	(akcja(typ_akcji w_trakcie))
;	=>
;	(printout t "Sygnalizacja numer " ?nr " zmienila swiatlo na " ?sw "." crlf)
;)

;(assert(akcja(typ_akcji zmiana_pory_dnia)))
(defrule zmien_pore_dnia
	?o <- (osoba (szybkosc ?sz)(bezpieczenstwo ?be))
	?a <- (akcja (typ_akcji zmiana_pory_dnia))
	?p <- (pora_dnia (czas ?cz))
	=>
	(if (= (str-compare ?cz "rano") 0)
		then
		(modify ?p (czas poludnie))
		(modify ?o (szybkosc (+ ?sz 5)))
		else
		(if (= (str-compare ?cz "poludnie") 0)
			then
			(modify ?p (czas wieczor))
			(modify ?o (szybkosc (- ?sz 5)))
			else
			(if (= (str-compare ?cz "wieczor") 0)
				then
				(modify ?p (czas noc))
				(modify ?o (szybkosc (+ ?sz 5))(bezpieczenstwo (- ?be 20)))
				else
				(modify ?p (czas rano))
				(modify ?o (szybkosc (- ?sz 5))(bezpieczenstwo (+ ?be 20)))
			)
		)
	)
	(retract ?a)	
)

(defrule zaczyna_padac
	?a <- (akcja (typ_akcji poczatek_deszczu))
	?o <- (osoba (szybkosc ?sz)(bezpieczenstwo ?be)(wygoda ?wy)(pojazd_mechaniczny ?pm))
	?p <- (pogoda (typ ?ty))
	=>
	(retract ?a)
	(modify ?p(typ deszcz))
	(if (= (str-compare ?pm "nie") 0)
		then
		(modify ?o(szybkosc (- ?sz 5))(bezpieczenstwo (- ?be 20))(wygoda (- ?wy 10)))
		else
		(modify ?o(szybkosc (- ?sz 5))(bezpieczenstwo (- ?be 20)))
	)
)

(defrule pojawienie_mgly
	?a <- (akcja (typ_akcji poczatek_mgly))
	?o <- (osoba (szybkosc ?sz)(bezpieczenstwo ?be)(pojazd_mechaniczny ?pm))
	?p <- (pogoda (typ ?ty))
	=>
	(retract ?a)
	(modify ?p(typ mgla))
	(if (= (str-compare ?pm "tak") 0)
		then
		(modify ?o(szybkosc (- ?sz 20))(bezpieczenstwo (- ?be 40)))
		else
		(modify ?o(bezpieczenstwo (- ?be 40)))
	)
)

(defrule zaczyna_smazyc
	?a <- (akcja (typ_akcji poczatek_upalu))
	?o <- (osoba (bezpieczenstwo ?be)(wygoda ?wy)(pojazd_mechaniczny ?pm)(rodzaj_pojazdu ?ro))
	?p <- (pogoda (typ ?ty))
	=>
	(retract ?a)
	(modify ?p(typ upal))
	(if (= (str-compare ?pm "nie") 0)
		then
		(modify ?o(bezpieczenstwo (- ?be 10))(wygoda (- ?wy 30)))
		else
		(if (= (str-compare ?ro mpk) 0)
			then
			(modify ?o(bezpieczenstwo (- ?be 10))(wygoda (- ?wy 50)))
			else
			(modify ?o(bezpieczenstwo (- ?be 10))(wygoda (- ?wy 15)))
		)
	)
)

(defrule zaczyna_sniezyc
	?a <- (akcja (typ_akcji poczatek_sniegu))
	?o <- (osoba (szybkosc ?sz)(bezpieczenstwo ?be)(wygoda ?wy)(pojazd_mechaniczny ?pm))
	?p <- (pogoda (typ ?ty))
	=>
	(retract ?a)
	(modify ?p(typ snieg))
	(if (= (str-compare ?pm "nie") 0)
		then
		(modify ?o(szybkosc (- ?sz 5))(bezpieczenstwo (- ?be 20))(wygoda (- ?wy 15)))
		else
		(modify ?o(szybkosc (- ?sz 25))(bezpieczenstwo (- ?be 30)))
	)
)

(defrule konczy_padac
	?a <- (akcja (typ_akcji koniec_deszczu))
	?o <- (osoba (szybkosc ?sz)(bezpieczenstwo ?be)(wygoda ?wy)(pojazd_mechaniczny ?pm))
	?p <- (pogoda (typ ?ty))
	=>
	(retract ?a)
	(modify ?p(typ zwykla))	
	(modify ?o(szybkosc (+ ?sz 5))(bezpieczenstwo (+ ?be 20)))
)

(defrule znikniecie_mgly
	?a <- (akcja (typ_akcji koniec_mgly))
	?o <- (osoba (szybkosc ?sz)(bezpieczenstwo ?be)(pojazd_mechaniczny ?pm))
	?p <- (pogoda (typ ?ty))
	=>
	(retract ?a)
	(modify ?p(typ zwykla))
	(if (= (str-compare ?pm "tak") 0)
		then
		(modify ?o(szybkosc (+ ?sz 20))(bezpieczenstwo (+ ?be 40)))
		else
		(modify ?o(bezpieczenstwo (+ ?be 40)))
	)
)

(defrule konczy_smazyc
	?a <- (akcja (typ_akcji koniec_upalu))
	?o <- (osoba (szybkosc ?sz)(bezpieczenstwo ?be)(wygoda ?wy)(pojazd_mechaniczny ?pm)(rodzaj_pojazdu ?ro))
	?p <- (pogoda (typ ?ty))
	=>
	(retract ?a)
	(modify ?p(typ zwykla))
	(if (= (str-compare ?pm "nie") 0)
		then
		(modify ?o(bezpieczenstwo (+ ?be 10))(wygoda (+ ?wy 10)))
		else
		(if (= (str-compare ?ro mpk) 0)
			then
			(modify ?o(bezpieczenstwo (+ ?be 10))(wygoda (+ ?wy 15)))
			else
			(modify ?o(bezpieczenstwo (+ ?be 10))(wygoda (+ ?wy 5)))
		)
	)
)

(defrule konczy_sniezyc
	?a <- (akcja (typ_akcji koniec_sniegu))
	?o <- (osoba (szybkosc ?sz)(bezpieczenstwo ?be)(wygoda ?wy)(pojazd_mechaniczny ?pm))
	?p <- (pogoda (typ ?ty))
	=>
	(retract ?a)
	(modify ?p(typ zwykla))
	(if (= (str-compare ?pm "nie") 0)
		then
		(modify ?o(szybkosc (+ ?sz 5))(bezpieczenstwo (+ ?be 20))(wygoda (+ ?wy 5)))
		else
		(modify ?o(szybkosc (+ ?sz 25))(bezpieczenstwo (+ ?be 30)))
	)
)

(defrule zablokuj_polaczenie
	?z <- (zablokuj (skad ?sk)(dokad ?do)(powod ?po))
	?p <- (polaczenie (skad ?sk)(dokad ?do)(czynne tak))
	=>
	(modify ?p(czynne nie))
	(printout t "Polaczenie pomiedzy " ?sk ", a " ?do " utrudnione/zablokowane, powod: " ?po "." crlf)
)

(defrule odblokuj_polaczenie
	?o <- (odblokuj (skad ?sk)(dokad ?do))
	?z <- (zablokuj (skad ?sk)(dokad ?do))
	?p <- (polaczenie (skad ?sk)(dokad ?do))
	=>
	(retract ?o)
	(retract ?z)
	(modify ?p(czynne tak))
	(printout t "Polaczenie pomiedzy " ?sk ", a " ?do " ponownie dostepne." crlf)
)

(defrule wystapienie_awarii
	?a <- (awaria (u_kogo ?uk))
	?o <- (osoba (nazwa ?uk)(szybkosc ?sz&:(> ?sz 0))(polozenie ?po))
	=>
	(modify ?a (szybkosc_przed ?sz))
	(modify ?o (szybkosc 0))
	(printout t "" ?uk " ma prblem z awaria. Musi czekac na naprawe w miejscu " ?po "." crlf)
)

(defrule naprawa_awarii
	?n <- (naprawa (u_kogo ?uk)(koszt ?ko))
	?a <- (awaria (u_kogo ?uk)(szybkosc_przed ?sp))
	?o <- (osoba (nazwa ?uk)(szybkosc ?sz)(koszt ?kt))
	=>
	(modify ?o (szybkosc ?sp)(koszt (+ ?kt ?ko)))
	(retract ?a)
	(retract ?n)
	(printout t "" ?uk " uporal sie z awaria. Moze ruszac dalej, ale jego koszt wzrosl." crlf)
)
	
